Amazon QuickSight ダッシュボード・分析・データセット一式をクロスアカウント移行してみた

Amazon QuickSight ダッシュボード・分析・データセット一式をクロスアカウント移行してみた

Clock Icon2024.07.09

本記事では、Amazon QuickSight の Assets as Bundle (AaB) 機能を使用し、ダッシュボードを別の AWS アカウントに移行する方法を説明します。

アセット移行検証1_ブログ (1)

Icons made by Freepik from Flaticon

以下のブログで紹介されている機能を使ったアカウントまたぎ移行をします。

https://dev.classmethod.jp/articles/quicksight-inport-export-job/

検証環境

  1. データソース
    • S3 上の CSV ファイル
  2. データフロー
    • S3 → Athena → SPICE(QuickSight)
  3. 可視化
    • QuickSight でデータを可視化

※ データソースは移行先のアカウントで新規に作成し直します。

QuickSight の構成

1つのデータセットをソースにした分析が2つあります。その分析からは各ダッシュボードを作成しています。

アセット移行検証2_ブログ (1)

今回はダッシュボード1を対象にして、その関連アセットも移行できるのか試しました。

Icons made by Freepik from Flaticon

移行手順

1. 移行元アカウントでの作業

このセクションでは、移行元の AWS アカウントでの作業を説明します。
主な手順は以下の通りです。

  1. 移行対象のダッシュボードを選択
  2. 選択したダッシュボードのアセットをエクスポート
  3. エクスポートしたアセットファイルを保存(後で移行先アカウントでインポートに使用)

アセット移行検証1_ブログ_1

Icons made by Freepik from Flaticon

1.1 移行対象ダッシュボードのARNを確認

以下のコマンドを実行して、移行したいダッシュボードの ARN を確認します。

SOURCE_ACCOUNT_ID=7111111111111

aws quicksight list-dashboards --aws-account-id $SOURCE_ACCOUNT_ID | jq '.DashboardSummaryList[] | {Name, Arn}'

コマンド実行結果

{
  "Name": "ダッシュボード2",
  "Arn": "arn:aws:quicksight:ap-northeast-1:7111111111111:dashboard/020acbd8-4a51-4300-b67a-6144379a1912"
}
{
  "Name": "ダッシュボード1",
  "Arn": "arn:aws:quicksight:ap-northeast-1:7111111111111:dashboard/f83a938f-9e7d-4f80-87d4-35d8d17a5520"
}

1.2 エクスポート設定ファイルの作成

input.jsonという名前のファイルを作成し、以下の内容を記述します。

  1. AwsAccountIdは移行元のアカウント ID を入力
  2. AssetBundleExportJobIdは任意の名前を入力
  3. ResourceArnsは移行したいダッシュボードの ARN を入力
{
    "AwsAccountId": "7111111111111",
    "AssetBundleExportJobId": "test-export-1",
    "ResourceArns": [
        "arn:aws:quicksight:ap-northeast-1:7111111111111:dashboard/f83a938f-9e7d-4f80-87d4-35d8d17a5520"
    ],
    "IncludeAllDependencies": true,
    "IncludePermissions": true,
    "ExportFormat": "QUICKSIGHT_JSON"
}

1.3 エクスポートの実行

以下のコマンドを実行して、エクスポートジョブを開始します。

aws quicksight start-asset-bundle-export-job --cli-input-json file://input.json

1.4 エクスポートジョブの状態確認とダウンロード

エクスポートジョブの状態を確認し、ダウンロード URL を取得するために以下のコマンドを実行します。

EXPORT_JOB_ID=test-export-1

aws quicksight describe-asset-bundle-export-job --aws-account-id $SOURCE_ACCOUNT_ID --asset-bundle-export-job-id $EXPORT_JOB_ID

コマンド実行結果に含まれるDownloadUrlをコピーし、Web ブラウザでアクセスすると、アセットファイルをダウンロードできます。

2. 移行先アカウントでの作業

移行先の AWS アカウントでの主な作業は以下の通りです。

  1. QuickSight ユーザーの確認
  2. パラメータ上書き用ファイルの作成
  3. エクスポートしたアセットのインポート

これらの手順で、ダッシュボードと関連リソースを新アカウントに移行します。

アセット移行検証1_ブログ_2

Icons made by Freepik from Flaticon

2.1 QuickSightユーザーの確認

移行先アカウントの QuickSight ユーザーを確認するために、以下のコマンドを実行します。

TARGET_ACCOUNT_ID=222222222222

aws quicksight list-users --aws-account-id $TARGET_ACCOUNT_ID --namespace default

コマンド実行結果から、インポートするアセットの所有者にするユーザーのArnを確認します。

{
    "UserList": [
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:222222222222:user/default/AWSReservedSSO_AdministratorAccess_44444444444444/YasutakaOhmura",
            "UserName": "AWSReservedSSO_AdministratorAccess_44444444444444/YasutakaOhmura",
            "Email": "abashiri@example.com",
            "Role": "ADMIN",
            "IdentityType": "IAM",
            "Active": true,
            "PrincipalId": "federated/iam/AAAAAAAAAAAAAAAA:YasutakaOhmura"
        }
    ],
    "Status": 200,
    "RequestId": "f8a20760-47ae-4e1d-bdb7-1a0bc8a4b918"
}

2.2 権限上書きファイルの作成

import-override-permission.jsonという名前のファイルを作成します。Principalsの値は「2.1 QuickSight ユーザーの確認」で確認したArnを入力します。

以下の JSON ファイルはこちらのドキュメントを参考にしました。

import-override-permission.json
{
    "DataSources": [
        {
            "DataSourceIds": ["*"],
            "Permissions": {
                "Principals": ["arn:aws:quicksight:ap-northeast-1:222222222222:user/default/AWSReservedSSO_AdministratorAccess_40e26c4a003f92cc/YasutakaOhmura"],
                "Actions": [
                    "quicksight:UpdateDataSourcePermissions",
                    "quicksight:DescribeDataSourcePermissions",
                    "quicksight:PassDataSource",
                    "quicksight:DescribeDataSource",
                    "quicksight:DeleteDataSource",
                    "quicksight:UpdateDataSource"
                ]
            }
        }
    ],
    "DataSets": [
        {
            "DataSetIds": ["*"],
            "Permissions": {
                "Principals": ["arn:aws:quicksight:ap-northeast-1:222222222222:user/default/AWSReservedSSO_AdministratorAccess_40e26c4a003f92cc/YasutakaOhmura"],
                "Actions": [
                    "quicksight:DeleteDataSet",
                    "quicksight:UpdateDataSetPermissions",
                    "quicksight:PutDataSetRefreshProperties",
                    "quicksight:CreateRefreshSchedule",
                    "quicksight:CancelIngestion",
                    "quicksight:PassDataSet",
                    "quicksight:ListRefreshSchedules",
                    "quicksight:UpdateRefreshSchedule",
                    "quicksight:DeleteRefreshSchedule",
                    "quicksight:DescribeDataSetRefreshProperties",
                    "quicksight:DescribeDataSet",
                    "quicksight:CreateIngestion",
                    "quicksight:DescribeRefreshSchedule",
                    "quicksight:ListIngestions",
                    "quicksight:DescribeDataSetPermissions",
                    "quicksight:UpdateDataSet",
                    "quicksight:DeleteDataSetRefreshProperties",
                    "quicksight:DescribeIngestion"
                ]
            }
        }
    ],
    "Themes": [
        {
            "ThemeIds": ["*"],
            "Permissions": {
                "Principals": ["arn:aws:quicksight:ap-northeast-1:222222222222:user/default/AWSReservedSSO_AdministratorAccess_40e26c4a003f92cc/YasutakaOhmura"],
                "Actions": [
                    "quicksight:ListThemeVersions",
                    "quicksight:UpdateThemeAlias",
                    "quicksight:DescribeThemeAlias",
                    "quicksight:UpdateThemePermissions",
                    "quicksight:DeleteThemeAlias",
                    "quicksight:DeleteTheme",
                    "quicksight:ListThemeAliases",
                    "quicksight:DescribeTheme",
                    "quicksight:CreateThemeAlias",
                    "quicksight:UpdateTheme",
                    "quicksight:DescribeThemePermissions"
                ]
            }
        }
    ],
    "Analyses": [
        {
            "AnalysisIds": ["*"],
            "Permissions": {
                "Principals": ["arn:aws:quicksight:ap-northeast-1:222222222222:user/default/AWSReservedSSO_AdministratorAccess_40e26c4a003f92cc/YasutakaOhmura"],
                "Actions": [
                    "quicksight:RestoreAnalysis",
                    "quicksight:UpdateAnalysisPermissions",
                    "quicksight:DeleteAnalysis",
                    "quicksight:DescribeAnalysisPermissions",
                    "quicksight:QueryAnalysis",
                    "quicksight:DescribeAnalysis",
                    "quicksight:UpdateAnalysis"
                ]
            }
        }
    ],
    "Dashboards": [
        {
            "DashboardIds": ["*"],
            "Permissions": {
                "Principals": ["arn:aws:quicksight:ap-northeast-1:222222222222:user/default/AWSReservedSSO_AdministratorAccess_40e26c4a003f92cc/YasutakaOhmura"],
                "Actions": [
                    "quicksight:DescribeDashboard",
                    "quicksight:ListDashboardVersions",
                    "quicksight:UpdateDashboardPermissions",
                    "quicksight:QueryDashboard",
                    "quicksight:UpdateDashboard",
                    "quicksight:DeleteDashboard",
                    "quicksight:DescribeDashboardPermissions",
                    "quicksight:UpdateDashboardPublishedVersion",
                    "quicksight:UpdateDashboardLinks"
                ]
            }
        }
    ]
}

2.3 インポートの実行

以下のコマンドを実行して、インポートジョブを開始します。

IMPORT_JOB_ID="test-import-1"
ASSET_BUNDLE_FILE="assetbundle-test-export-1.qs"
PERMISSIONS_FILE="import-override-permission.json"

aws quicksight start-asset-bundle-import-job \
  --aws-account-id "$TARGET_ACCOUNT_ID" \
  --asset-bundle-import-job-id "$IMPORT_JOB_ID" \
  --asset-bundle-import-source-bytes "fileb://$ASSET_BUNDLE_FILE" \
  --override-permissions "file://$PERMISSIONS_FILE"

2.4 インポート結果の確認

インポートジョブの結果を確認するために、以下のコマンドを実行します。

aws quicksight describe-asset-bundle-import-job --aws-account-id $TARGET_ACCOUNT_ID --asset-bundle-import-job-id $IMPORT_JOB_ID

2.5 QuickSight から確認

マネジメントコンソール から QuickSight を開き、ダッシュボード、分析、データセットが正しく移行されていることを確認します。

QuickSight_-_データセット
QuickSight_-_分析-3
QuickSight_-_ダッシュボード-3

データソースが正しく設定されていないため、データセットの更新に失敗します。

QuickSight_-_データセット-2

3. データソースの再設定

このセクションでは、移行後のデータソース設定手順を説明します。

  1. 移行先アカウントでの Athena 設定
  2. QuickSight のデータセット更新

アセット移行検証1_ブログ_3

Icons made by Freepik from Flaticon

3.1 Athena 再設定

移行先アカウントの Athena で、移行元と同名のデータベースとデータソースを作成します。

クエリエディタ___Athena___ap-northeast-1-3

3.2 データセット更新

データセットを更新します。成功すれば無事移行完了です。

QuickSight_-_データセット-3

4. 確認

最後にダッシュボードが正しく表示されることを確認します。

ダッシュボード1

以上で、Amazon QuickSight のクロスアカウント移行手順は完了です。この手順を参考に、効率的な QuickSight アセットの管理を行ってください。

付録

アセットバンドルの中身

ダウンロードしたアセットファイルを展開すると、データセットなどのアセットの情報が JSON ファイルになっています。

unzip assetbundle-test-export-1.qs

解凍後のファイル構造は以下のようになります。

$ tree
.
├── analysis
│   └── 895fad08-f210-4a09-9d7e-2883c73611f2.json
├── assetbundle-test-export-1.qs
├── dashboard
│   └── f83a938f-9e7d-4f80-87d4-35d8d17a5520.json
├── dataset
│   └── dbafcc53-9231-403f-9fcb-52990a458a52.json
├── datasource
│   └── 4a4a4c57-0bb8-46fa-956c-27f571c1c028.json
└── info.json

展開した JSON ファイルを直接使用することはありませんでした。

おわりに

本記事では、Amazon QuickSight の Assets as Bundle (AaB) 機能を使用したクロスアカウント移行の手順を解説しました。この方法を活用することで、効率的に QuickSight のアセットを異なるアカウントへダッシュボードの移行が可能になります。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.